package top.lishuoboy.mybatisp.bean;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Date;

/**
 * 用户
 * bean 继承 Model ，开启 ActiveRecord
 *
 * @author lishuoboy
 */
@Data
@TableName("user") // mp描述：表名注解，标识实体类对应的表
@Accessors(chain = true)
// mybatis 别名 在没有注解的情况下，会使用 Bean 的首字母小写的非限定类名来作为它的别名
// 可以使用@Alias指定别名
//@Alias("user")
public class User extends Model<User> {
    /*
     * 描述：主键注解
     *
     * 【值】	        【描述】
     * AUTO	            数据库 ID 自增
     * NONE[默认]        无状态，该类型为未设置主键类型（注解里等于跟随全局，全局里约等于 INPUT）
     * INPUT	        insert 前自行 set 主键值，与 AUTO 的区别是：如果对象id为空会报错
     * ASSIGN_ID	    插入对象ID为空时自动分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
     *                  MP 默认雪花算法: 41位时间戳部分 - 1288834974657L(即2010-11-04 09:42:54) | 5位数据中心部分 | 5位机器标识部分 | 12位序列号部分。代码见 com.baomidou.mybatisplus.core.toolkit.Sequence.nextId()、com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator.nextId()
     * ASSIGN_UUID	    插入对象ID为空时自动分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)
     *
     * [过时]ID_WORKER	    分布式全局唯一 ID 长整型类型(please use ASSIGN_ID)
     * [过时]ID_WORKER_STR   分布式全局唯一 ID 字符串类型(please use ASSIGN_ID)
     * [过时]UUID	        32 位 UUID 字符串(please use ASSIGN_UUID)
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    private String userName;
    private Integer age;
    /** 数据库字段名（驼峰不需要） */
    @TableField(value = "email")
    private String mail;
    /** 数据库不存在字段名 */
    @TableField(exist = false)
    private String addr;
    // 3、bean  增加字段“version”，并注解 @Version
    @Version
    private Integer version;
    // 2、bean  增加字段“deleted”，并注解 @TableLogic。配置文件已配置全局逻辑删除的实体字段名（logic-delete-field: deleted），且字段名字一致的，可以不在bean上注解 @TableLogic(since 3.3.0
    @TableLogic
    private Boolean deleted;

    // 2、bean 增加自动填充字段
    // 注意！这里需要标记为填充字段
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    // 注意！这里需要标记为填充字段
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /** 租户 ID */
    private Long tenantId;

    public User setId(Long id) {
        this.id = id;
        return this;
    }

    /* 兼容改为Long之前的 Integer */
    public User setId(Integer id) {
        this.id = Long.valueOf(id);
        return this;
    }
}